#pragma once
#include<string>
#include<iostream>
#include<sys/socket.h>
#include<sys/types.h>

namespace wyl
{
    //工具类
    class Unit
    {
    public:
        //读取字符串的每一行
        static int ReadLine(int sock , std::string& out)
        {
            //清空out
            out.clear();
            char ch = 'a';
            while(ch != '\n')
            {
                ssize_t s = recv(sock,&ch,1,0); //读取一个字符
                if(s > 0)
                {
                    //读取成功
                    if(ch == '\r')
                    {
                        // \r -> \n or \r\n -> \n 
                        recv(sock,&ch,1,MSG_PEEK); //窥探下一个字符，但是仍在缓冲区内不提取
                        if(ch == '\n')
                        {
                            //\r\n的情况
                            //\r的下一个字符是\n，那么再读取一次,把\r顶替掉
                            recv(sock,&ch,1,0);
                        }else
                        {
                            // \r的情况,直接把ch换成\n
                            ch = '\n';
                        }
                    }
                    out += ch;
                }
                else if(s == 0)
                {
                    //读完了
                    return 0;
                }
                else 
                {
                    //读取错误
                    return -1;
                }
            }
            return out.size();
        }
        //字符串切分
        static bool CutString(std::string target , std::string& sub1_out , std::string& sub2_out ,std::string sep )
        {
            //例如把 AAAA: BBBBB 切分成 AAAA和 BBBBB
            size_t pos = target.find(sep); //找到间隔符所在的下标
            if(pos != std::string::npos) //如果找到了间隔符
            {
                sub1_out = target.substr(0,pos); // key_out = 0 ~ pos的位置
                sub2_out = target.substr(pos+sep.size()); 
                return true;
            }
            return false; 
        }
    };
}
